home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / utility / 329 / xc64.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-10-18  |  14.4 KB  |  535 lines

  1.  
  2. /***************************************************************************
  3.  
  4.     XC64.C
  5.  
  6.     - Commiedore 64 service routines
  7.  
  8.     02/05/88 created
  9.     03/03/88 Laser C
  10.  
  11.     09/28/88 20:10
  12.  
  13. ***************************************************************************/
  14.  
  15. #include <stdio.h>
  16. #include <osbind.h>
  17. #include "xglobal.h"
  18. #include "x6502.h"
  19.  
  20. extern
  21.     rsC00(), rsC01(), rsC02(), rsC03(), rsC04(), rsC05(), rsC06(), rsC07(),
  22.     rsC08(), rsC09(), rsC0A(), rsC0B(), rsC0C(), rsC0D(), rsC0E(), rsC0F();
  23.  
  24. extern
  25.     wsC00(), wsC01(), wsC02(), wsC03(), wsC04(), wsC05(), wsC06(), wsC07(),
  26.     wsC08(), wsC09(), wsC0A(), wsC0B(), wsC0C(), wsC0D(), wsC0E(), wsC0F();
  27.  
  28. extern rsCXX(), wsCXX();
  29. extern TextPlotC64(), lPlotC64TextMono();
  30. extern LCmpEaX(), LCmpEaY(), LCfont();
  31. extern Apple_Hook(), Apple_Unhook();
  32.  
  33. /* array of pointersC to 256 service routines */
  34. void (*Cread_service[17])() =
  35.     {
  36.     rsC00, rsC01, rsC02, rsC03, rsC04, rsC05, rsC06, rsC07,
  37.     rsC08, rsC09, rsC0A, rsC0B, rsC0C, rsC0D, rsC0E, rsC0F, rsCXX
  38.     };
  39.  
  40. void (*Cwrite_service[17])() =
  41.     {
  42.     wsC00, wsC01, wsC02, wsC03, wsC04, wsC05, wsC06, wsC07,
  43.     wsC08, wsC09, wsC0A, wsC0B, wsC0C, wsC0D, wsC0E, wsC0F, wsCXX
  44.     };
  45.  
  46. extern int baddr1[25];
  47. extern int baddr2[25];
  48.  
  49. setup_c64()
  50.     {
  51.     register unsigned ea;
  52.     register int x,y;
  53.     register char *qRStat = (char *)lRStat;
  54.     register char *qWStat = (char *)lWStat;
  55.  
  56.     /* clear out stat arrays */
  57.     Blitzl(lRStat - 32768L, 16384);
  58.     Blitzl(lWStat - 32768L, 16384);
  59.  
  60.     /* write-protect ROM */
  61.     Blitb(lScratch, lMemory + (unsigned)0xA000, 8192);
  62.     Blitb(lScratch + (unsigned) 0x2000, lMemory + (unsigned)0xE000, 8192);
  63.     Blitc(1+128, &qWStat[0xFFFFA000], 8192);
  64.     Blitc(1+128, &qWStat[0xFFFFE000], 8192);
  65.  
  66.     /* text page 1 */
  67.     for (ea=1024; ea<2048; ea++)
  68.         {
  69.         qWStat[ea]=2+128;
  70.         }
  71.  
  72.     qRStat[0xFFFFD012] = 7;     /* some register ?? */
  73.     qWStat[0x0292] = 8+128; /* kludge for keyboard */
  74.     {
  75.     int iHeap = 0;
  76.     long lToRS, lToWS;
  77.     long lFromRS, lFromWS, lNextRS, lNextWS;
  78.     int iService = 0;
  79.  
  80.     /* blit the 16 read and 16 write routines */
  81.     do
  82.         {
  83.         lToRS = lEmul + iHeap + (int)iRead;
  84.         lFromRS = (long)Cread_service[iService];
  85.         lNextRS = (long)Cread_service[iService+1];
  86.  
  87.         lToWS = lEmul + iHeap + (int)iWrite;
  88.         lFromWS = (long)Cwrite_service[iService];
  89.         lNextWS = (long)Cwrite_service[iService+1];
  90.  
  91. #ifdef NDEBUG
  92.         printf("Blit %d bytes, opcode %2x, from %6lx to %6lx\n",
  93.             (int)(lNextOp - lOpcode), opcode, lOpcode, lToHeap);
  94. #endif
  95.         Assert(((int)(lNextRS - lFromRS)) >= 0, "RS blitting negative");
  96.         Assert(((int)(lNextRS - lFromRS)) != 0, "RS blitting 0");
  97.         Assert(((int)(lNextRS - lFromRS)) <= 64, "RS blitting >64");
  98.         
  99.         Blitb(lFromRS, lToRS, (int)(lNextRS - lFromRS));
  100.         Blitb(lFromWS, lToWS, (int)(lNextWS - lFromWS));
  101.  
  102.         iHeap += 256;
  103.         iService++;
  104.         } while (iService != 16);
  105.     }
  106.     /* set initial SP = $FF */
  107.     PutReg('SP',0xFF);
  108.  
  109.     /* to save time when plotting, generate Apple font and x,y info */
  110.  
  111.     qRStat = (char *)LCmpEaX;
  112.     qWStat = (char *)LCmpEaY;
  113.     for (ea=0; ea<1024; ea++)
  114.         {
  115.         qWStat[ea] = ea/40; /* screen row */
  116.         qRStat[ea] = ea%40; /* screen column */
  117.         }    
  118.  
  119.     qRStat = (char *)lFont8;
  120.     qWStat = (char *)LCfont;
  121.     for (ea=0; ea<256; ea++)
  122.         {
  123.         x = (ea & 0x20) ? (ea & 0x7F) : ((ea&0x7F) ^ 0x40);
  124.         for (y=0; y<2048; y+= 256)
  125.             {
  126.             *qWStat++ = qRStat[x+y] ^ ((ea & 0x80) ? ~0 : 0);
  127.             }
  128.         }
  129.     pHookIn = Apple_Hook;
  130.     pUnHook = Apple_Unhook;
  131.     }
  132.     
  133. /* End of init code */
  134.  
  135.  
  136. TextPlotC64(text,loc)
  137. register int text;
  138. register int loc;
  139.     {
  140.     register int scrx, scry;
  141.     register char *qbFont = (char *)LCfont;
  142.     register char *qbScr = (char *)(lScr+3840L);
  143.     extern char Lmp8to16();
  144.     register char *qmp816 = (char *)Lmp8to16;   /* mono only */
  145.  
  146. #ifdef NDEBUG
  147.     printf("C64Plot(): loc = %d    value = %d\n", loc, text);
  148. #endif
  149.  
  150.     loc &= 1023;
  151.     scrx = *((char *)LCmpEaX + loc);
  152.     scry = *((char *)LCmpEaY + loc);
  153.  
  154.     qbFont += (text<<3);
  155.  
  156.     if (fIsMono)
  157.         goto lPlotC64TextMono;
  158.  
  159. asm
  160.     {
  161.     move.w  scrx,D0               ; do funny bit field gyrations
  162.     andi.w  #~1,D0
  163.     add.w   D0,D0
  164.     add.w   D0,D0
  165.     andi.w  #1,scrx
  166.     or.w    D0,scrx 
  167.     }
  168.  
  169.     qbScr += baddr1[scry] + scrx;
  170.  
  171. asm
  172.     {
  173.     move.b  (qbFont)+,D0
  174.     move.b  D0,(qbScr)
  175.     move.b  D0,2(qbScr)
  176.     sf      4(qbScr)
  177.     sf      6(qbScr)
  178.  
  179.     move.b  (qbFont)+,D0
  180.     move.b  D0,160(qbScr)
  181.     move.b  D0,162(qbScr)
  182.     sf      164(qbScr)
  183.     sf      166(qbScr)
  184.  
  185.     move.b  (qbFont)+,D0
  186.     move.b  D0,320(qbScr)
  187.     move.b  D0,322(qbScr)
  188.     sf      324(qbScr)
  189.     sf      326(qbScr)
  190.  
  191.     move.b  (qbFont)+,D0
  192.     move.b  D0,480(qbScr)
  193.     move.b  D0,482(qbScr)
  194.     sf      484(qbScr)
  195.     sf      486(qbScr)
  196.  
  197.     move.b  (qbFont)+,D0
  198.     move.b  D0,640(qbScr)
  199.     move.b  D0,642(qbScr)
  200.     sf      644(qbScr)
  201.     sf      646(qbScr)
  202.  
  203.     move.b  (qbFont)+,D0
  204.     move.b  D0,800(qbScr)
  205.     move.b  D0,802(qbScr)
  206.     sf      804(qbScr)
  207.     sf      806(qbScr)
  208.  
  209.     move.b  (qbFont)+,D0
  210.     move.b  D0,960(qbScr)
  211.     move.b  D0,962(qbScr)
  212.     sf      964(qbScr)
  213.     sf      966(qbScr)
  214.  
  215.     move.b  (qbFont)+,D0
  216.     move.b  D0,1120(qbScr)
  217.     move.b  D0,1122(qbScr)
  218.     sf      1124(qbScr)
  219.     sf      1126(qbScr)
  220.     }
  221.     return;
  222.  
  223. lPlotC64TextMono:
  224.     qbScr += baddr1[scry] + scrx + scrx;
  225.  
  226. asm
  227.     {
  228.     clr.w   D0
  229.     move.b  (qbFont)+,D0
  230.     add.w   D0,D0
  231.     move.w  0(qmp816,D0),D0
  232.     move.w  D0,(qbScr)
  233.     move.w  D0,80(qbScr)
  234.  
  235.     clr.w   D0
  236.     move.b  (qbFont)+,D0
  237.     add.w   D0,D0
  238.     move.w  0(qmp816,D0),D0
  239.     move.w  D0,160(qbScr)
  240.     move.w  D0,240(qbScr)
  241.  
  242.     clr.w   D0
  243.     move.b  (qbFont)+,D0
  244.     add.w   D0,D0
  245.     move.w  0(qmp816,D0),D0
  246.     move.w  D0,320(qbScr)
  247.     move.w  D0,400(qbScr)
  248.  
  249.     clr.w   D0
  250.     move.b  (qbFont)+,D0
  251.     add.w   D0,D0
  252.     move.w  0(qmp816,D0),D0
  253.     move.w  D0,480(qbScr)
  254.     move.w  D0,560(qbScr)
  255.  
  256.     clr.w   D0
  257.     move.b  (qbFont)+,D0
  258.     add.w   D0,D0
  259.     move.w  0(qmp816,D0),D0
  260.     move.w  D0,640(qbScr)
  261.     move.w  D0,720(qbScr)
  262.  
  263.     clr.w   D0
  264.     move.b  (qbFont)+,D0
  265.     add.w   D0,D0
  266.     move.w  0(qmp816,D0),D0
  267.     move.w  D0,800(qbScr)
  268.     move.w  D0,880(qbScr)
  269.  
  270.     clr.w   D0
  271.     move.b  (qbFont)+,D0
  272.     add.w   D0,D0
  273.     move.w  0(qmp816,D0),D0
  274.     move.w  D0,960(qbScr)
  275.     move.w  D0,1040(qbScr)
  276.  
  277.     clr.w   D0
  278.     move.b  (qbFont)+,D0
  279.     add.w   D0,D0
  280.     move.w  0(qmp816,D0),D0
  281.     move.w  D0,1120(qbScr)
  282.     move.w  D0,1200(qbScr)
  283.     }
  284.     }
  285.  
  286.  
  287. c64()
  288.     {
  289. asm {
  290.  
  291. LCmpEaX:
  292.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  293.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  294.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  295.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  296.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  297.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  298.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  299.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  300.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  301.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  302.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  303.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  304.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  305.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  306.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  307.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  308.  
  309. LCmpEaY:
  310.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  311.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  312.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  313.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  314.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  315.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  316.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  317.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  318.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  319.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  320.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  321.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  322.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  323.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  324.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  325.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  326.  
  327. LCfont:
  328.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  329.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  330.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  331.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  332.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  333.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  334.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  335.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  336.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  337.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  338.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  339.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  340.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  341.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  342.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  343.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  344.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  345.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  346.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  347.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  348.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  349.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  350.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  351.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  352.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  353.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  354.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  355.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  356.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  357.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  358.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  359.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  360.  
  361. wsC00:
  362.     nop     ; this is just a dummy
  363.  
  364. ; handler for ROM, do nothing
  365. wsC01:
  366.     addq.l  #2,SP
  367.     DISPATCH
  368.  
  369. ; handler for text page 1
  370. wsC02:
  371.     move.w  (SP)+,drDATA
  372.     move.l  drEA,arEA
  373.     cmp.b   (arEA),drDATA   ; check if byte we're storing is already there
  374.     beq.s   wsC02X           ; if so, no need to plot the character
  375.  
  376.     move.b  drDATA,(arEA)   ; else, store new character and plot it
  377.     SAVEREGS
  378.     move.w  drEA,-(SP)
  379.     move.w  drDATA,-(SP)
  380.     jsr     TextPlotC64       ; call TextPlotC64(drDATA,drEA)
  381.     addq.l   #4,SP
  382.     LOADREGS
  383. wsC02X:
  384.     DISPATCH
  385.  
  386. wsC03:
  387.     addq.l  #2,SP
  388.     DISPATCH
  389. wsC04:
  390.     addq.l  #2,SP
  391.     DISPATCH
  392. wsC05:
  393.     addq.l  #2,SP
  394.     DISPATCH
  395. wsC06:
  396.     addq.l  #2,SP
  397.     DISPATCH
  398. wsC07:
  399.     addq.l  #2,SP
  400.     DISPATCH
  401. wsC08:
  402.     move.l  drEA,arEA
  403.     move.w  (SP)+,drDATA
  404.     move.b  drDATA,(arEA)
  405.     movem.l D1-D7/A0-A2,-(SP) ; must save A0, A1, A2 before a TRAP
  406.  
  407.     move.w  #2,-(SP)
  408.     move.w  #1,-(SP)
  409.     trap    #13         ; Bconstat(2)
  410.     addq.l  #4,SP
  411.  
  412.     tst.w   D0          ; is there a key ready?
  413.     beq.s   wsC083      ; no
  414.  
  415. wsC082:
  416.     move.w  #2,-(SP)
  417.     move.w  #2,-(SP)
  418.     trap    #13         ; Bconin(2)
  419.     addq.l  #4,SP
  420.  
  421.     move.w  #0x277,drEA
  422.     move.l  drEA,arEA
  423.     cmpi.b  #8,drDATA   ; backspace is 20, not 8
  424.     bne.s   wsC084
  425.     moveq   #20,drDATA
  426. wsC084:
  427.     cmpi.b  #64,drDATA
  428.     bcs     wsC085
  429.     eori.b  #32,drDATA
  430. wsC085:
  431.     move.b  drDATA,(arEA)
  432.     move.w  #0x00C6,drEA
  433.     move.l  drEA,arEA
  434.     addq.b  #1,(arEA)
  435. wsC083:
  436.     movem.l (SP)+,D1-D7/A0-A2
  437.     DISPATCH
  438.  
  439. wsC09:
  440.     addq.l  #2,SP
  441.     DISPATCH
  442. wsC0A:
  443.     addq.l  #2,SP
  444.     DISPATCH
  445. wsC0B:
  446.     addq.l  #2,SP
  447.     DISPATCH
  448. wsC0C:
  449.     addq.l  #2,SP
  450.     DISPATCH
  451. wsC0D:
  452.     addq.l  #2,SP
  453.     DISPATCH
  454. wsC0E:
  455.     addq.l  #2,SP
  456.     DISPATCH
  457. wsC0F:
  458.     addq.l  #2,SP
  459.     DISPATCH
  460. wsCXX:
  461.     addq.l  #2,SP
  462.     DISPATCH
  463.  
  464. rsC00:
  465.     rts
  466. rsC01:
  467.     rts
  468. rsC02:
  469.     rts
  470. rsC03:
  471.     rts
  472. rsC04:
  473.     rts
  474. rsC05:
  475.     rts
  476. rsC06:
  477.     rts
  478.  
  479. rsC07:
  480.     move.l  drEA,arEA
  481.     clr.b   (arEA)
  482.     rts
  483.  
  484. ; read $xxxx, the C64's keyboard flag
  485. rsC08:
  486.     movem.l D1-D7/A0-A2,-(SP) ; must save A0, A1, A2 before a TRAP
  487.  
  488.     move.w  #2,-(SP)
  489.     move.w  #1,-(SP)
  490.     trap    #13         ; Bconstat(2)
  491.     addq.l  #4,(SP)+
  492.  
  493.     tst.w   D0          ; is there a key ready?
  494.     bne.s   rsC082       ; yes
  495.     movem.l (SP)+,D1-D7/A0-A2 ; else just exit
  496.     rts
  497.  
  498. rsC082:
  499.     move.w  #2,-(SP)
  500.     move.w  #2,-(SP)
  501.     trap    #13         ; Bconin(2)
  502.     addq.l  #4,(SP)+
  503.  
  504.     move.l  drEA,arEA
  505.     clr.b   (arEA)
  506.     move.w  #0x277,drEA
  507.     move.l  drEA,arEA
  508.     move.b  drDATA,(arEA)
  509.     move.w  #0x00C6,drEA
  510.     move.l  drEA,arEA
  511.     addq.b  #1,(arEA)
  512.     movem.l (SP)+,D1-D7/A0-A2
  513.     rts
  514.  
  515. rsC09:
  516.     rts
  517. rsC0A:
  518.     rts
  519. rsC0B:
  520.     rts
  521. rsC0C:
  522.     rts
  523. rsC0D:
  524.     rts
  525. rsC0E:
  526.     rts
  527. rsC0F:
  528.     rts
  529. rsCXX:
  530.     rts
  531.     }
  532.     }
  533.  
  534.  
  535.